home *** CD-ROM | disk | FTP | other *** search
- {
- Here a nice unit to control the DOS Printer spooler (PRINT.COM/EXE).
- It's a extended/modified/debugged version of some program I found
- elsewere. By controlling the DEFINE the source changes from PROGRAM
- to UNIT. Just load good PRINT, Compile the demo and try to print some.
- Watch your paper supply !!
-
- {---------------------------------------------------------}
- { Original by Brian Ebarb Power Software Company - }
- { Houston, TX (713)781-9784 }
- { }
- { Modified by G.W. van der Vegt }
- {---------------------------------------------------------}
-
- { DEFINE UNIT}
- {$IFDEF UNIT}
-
- UNIT Spooler;
-
- INTERFACE
-
- {$ELSE}
-
- USES
- crt,
- dos;
-
- {$ENDIF}
-
- CONST
- queue_max = 10;
- queue_namlen = 64;
-
- TYPE
- {----Queue types}
- queue_action = 1..5;
- queue_printer = 1..4;
- queue_name = STRING[queue_namlen-1];
- queue_type = ARRAY[1..queue_max] OF queue_name;
-
- CONST
- {----Queue actions}
- queue_submit = 1;
- queue_kill = 2;
- queue_purge = 3;
- queue_hold = 4;
- queue_continue = 5;
-
- {----Queue results}
- queue_ok = $00;
- queue_invfie = $01;
- queue_nofile = $02;
- queue_nopath = $03;
- queue_nohandles = $04;
- queue_noaccess = $05;
- queue_full = $08;
- queue_busy = $09;
- queue_missing = $0a; {----self defined returncode,
- returned IF called AND NOT
- installed.}
- queue_longname = $0c;
- queue_nowprinting = $9e;
-
- VAR
- queue : queue_type;
-
- {$IFDEF UNIT}
-
- FUNCTION Spool(filestring : queue_name;
- theprinter : queue_printer;
- action : queue_action) : WORD;
-
- {---------------------------------------------------------}
-
- IMPLEMENTATION
-
- USES
- crt,
- dos;
-
- {---------------------------------------------------------}
-
- {$ENDIF}
-
- FUNCTION Spool(filestring : queue_name;
- theprinter : queue_printer;
- action : queue_action) : WORD;
-
- CONST
- {----MPX interrupt const}
- queue_int = $2f;
- queue_mpx = $01;
- queue_check = $00;
- queue_installed = $ff;
-
- TYPE
- fnames = ARRAY[1..queue_namlen] OF CHAR;
- res = ARRAY[1..32768 DIV Sizeof(fnames)] OF fnames;
-
- VAR
- p : ^res;
- regs : registers;
- fname : fnames;
- thefile : RECORD
- prn : BYTE;
- loc : ARRAY[1..2] OF WORD;
- END;
- i,j : INTEGER;
-
- BEGIN
- Fillchar(fname, Sizeof(fname), #0);
- Move(filestring[1],fname[1],Length(filestring));
-
- thefile.prn := theprinter - 1;
- thefile.loc[2] := Seg(fname);
- thefile.loc[1] := Ofs(fname);
-
- {----Check installation}
- regs.ah := queue_mpx;
- regs.al := queue_check;
-
- Intr(queue_int, regs);
- IF (regs.al<>queue_installed)
- {----on return, 10 = "not installed" }
- THEN Spool:=queue_missing
- ELSE
- CASE action OF
- {----Spool a FILE, return error OR
- 00 IF no error
- 01 IF added TO queue OR
- 9e IF printing }
- queue_submit : BEGIN
- regs.ah:=queue_mpx;
- regs.al:=queue_submit;
- regs.ds:=Seg(thefile);
- regs.dx:=Ofs(thefile);
-
- Intr(queue_int, regs);
-
- IF ((regs.flags AND fcarry) = fcarry)
- THEN Spool:=regs.ax
- ELSE Spool:=regs.al;
- END;
- {----Dequeue a file, Returns Error or ok }
- queue_kill : BEGIN
- regs.ah:=queue_mpx;
- regs.al:=queue_kill;
- regs.ds:=thefile.loc[2];
- regs.dx:=thefile.loc[1];
-
- Intr(queue_int, regs);
-
- IF ((regs.flags AND fcarry) = fcarry)
- THEN Spool := regs.ax
- ELSE Spool := queue_ok;
- END;
-
- {----Deque ALL files, Returns Error or ok }
- queue_purge : BEGIN
- regs.ah := queue_mpx;
- regs.al := queue_purge;
-
- Intr(queue_int, regs);
-
- IF ((regs.flags AND fcarry) = fcarry)
- THEN Spool := regs.ax
- ELSE Spool := queue_ok;
- END;
-
- {----Hold queue, returns error OR
- no. OF errors since last hold (dx) ?
- (seems TO be no. OF looks at Printer port) &
- queue RECORD WITH first queue_max filenames}
- queue_hold : BEGIN
- regs.ah:=queue_mpx;
- regs.al:=queue_hold;
-
- Intr(queue_int, regs);
-
- IF ((regs.flags AND fcarry) = fcarry)
- THEN Spool := regs.ax
- ELSE
- {----Fill & return the queue record}
- BEGIN
- Spool:=queue_ok; {Regs.dx}
- p:=Ptr(regs.ds,regs.si);
-
- FOR i:=1 TO queue_max DO queue[i]:='';
- i:=1;
- WHILE (p^[i,1]<>#00) AND (i<=queue_max) DO
- BEGIN
- j:=1;
- WHILE (p^[i,j]<>#00) DO
- BEGIN
- queue[i]:=queue[i]+p^[i,j];
- Inc(j);
- END;
- Inc(i);
- END;
- END;
- END;
-
- {----Restart queue after function 4, Returns error or ok }
- queue_continue : BEGIN
- regs.ah:=queue_mpx;
- regs.al:=queue_continue;
-
- Intr(queue_int, regs);
-
- IF ((regs.flags AND fcarry) = fcarry)
- THEN Spool := regs.ax
- ELSE Spool := queue_ok;
- END;
- END;
-
- END; {of Spool}
-
- {$IFNDEF UNIT}
-
- {---------------------------------------------------------}
- {----MAIN PROGRAM }
- {---------------------------------------------------------}
-
- VAR
- i : INTEGER;
-
- BEGIN
- FOR i:=1 TO queue_max DO queue[i]:='';
-
- REPEAT
- Writeln('Type cmd : 1 = submit, 2 = kill, 3 = purge, 4 = hold, 5 = continue
-
- CASE Readkey OF
- #27 : Halt;
- '1' : Writeln('Function 1, result = ',Spool('\AUTOEXEC.BAT',1,queue_submi
- '2' : Writeln('Function 2, result = ',Spool('\AUTOEXEC.BAT',1,queue_kill
- '3' : Writeln('Function 3, result = ',Spool('',1,queue_purge ));
- '4' : BEGIN
- Writeln('Function 4, result = ',Spool('',1,queue_hold ));
- Writeln('Queue : ');
- FOR i:=1 TO queue_max DO
- IF (queue[i]<>'')
- THEN Writeln(i:2,' ',queue[i]);
- END;
- '5' : Writeln('Function 5, result = ',Spool('',1,queue_continue));
- END;
- UNTIL true=false;
-
- {$ENDIF}
-
- END.